home *** CD-ROM | disk | FTP | other *** search
-
- /********************************************************************/
- /* SOURCE CODE FILE */
- /********************************************************************/
- /*
- * >>> File name: TextObject.c
- *
- * >>> Purpose: Methods for Text Object
- * >>> Project: PoopDraw Version 1
- * >>> Date: 2/20/89
- * >>> By: Adam Treister
- *
- */
- /********************************************************************/
- /* For Your Information 1802 Hillside Rd. SB CA 93101 */
- /********************************************************************/
-
- #include "PoopDrawInc"
-
- /***** Object Type Defs *********************************************/
-
- typedef struct
- {
- _StdObjectFields
- Boolean frameIt;
- TEHandle teH;
-
- } TextObjectRec,*TextObjectPtr,**TextObjectHandle;
-
- /***** Public Functions *********************************************/
-
- ObjectHandle NewTextObj(LPtr ParmP);
-
- /***** Private Functions ********************************************/
-
- private void ObjDispatch(TextObjectHandle ObjectH,int Message,LPtr InParmP);
- private void Dispose(TextObjectHandle ObjectH);
- private void Duplicate(TextObjectHandle ObjectH, LPtr OutParmP);
- private void Draw(TextObjectHandle ObjectH);
- private void MouseDown(TextObjectHandle ObjectH);
- private void KeyDown(TextObjectHandle ObjectH);
- private void Activate(TextObjectHandle ObjectH);
- private void Deactivate(TextObjectHandle ObjectH);
- private void Resize(TextObjectHandle ObjectH,LPtr ParmP);
- private void Move(TextObjectHandle ObjectH,LPtr ParmP);
- private void Pack(TextObjectHandle ObjectH,Handle h);
- private void UnPack(TextObjectHandle ObjectH,Ptr *pP);
- private void SetLength(TextObjectHandle ObjectH);
-
- #define TEINSET 4
- /********************************************************************/
-
-
- void ObjDispatch(ObjectH,Message,ParmP)
- TextObjectHandle ObjectH;
- int Message;
- LPtr ParmP;
-
- {
- switch(Message)
- {
-
- case DISPOSE: Dispose(ObjectH); break;
- case DRAW: Draw(ObjectH); break;
- case MOUSEDOWN: MouseDown(ObjectH); break;
- case KEYDOWN: KeyDown(ObjectH); break;
- case ACTIVATE: Activate(ObjectH); break;
- case DEACTIVATE: Deactivate(ObjectH); break;
-
- case CUT: TECut((*ObjectH)->teH); break;
- case COPY: TECopy((*ObjectH)->teH); break;
- case PASTE: TEPaste((*ObjectH)->teH); break;
-
- case IDLE: TEIdle((*ObjectH)->teH); break;
-
- case RESIZE: Resize(ObjectH,ParmP); break;
- case MOVE: Move(ObjectH,ParmP); break;
- case SETLEN: SetLength(ObjectH); break;
- case PACK: Pack(ObjectH,ParmP); break;
- case UNPACK: UnPack(ObjectH,ParmP); break;
-
- case FILL:
- case PENPAT:
- case PENSIZE: /* ignore */ break;
-
- default: DrawObjectDispatch(ObjectH,Message,ParmP);
- }
- }
- /*-------------------------------------------NEW-----------------*/
-
- ObjectHandle NewTextObj(ParmP)
- LPtr ParmP;
- {
- TextObjectHandle obj;
- Rect r;
-
- r = *(Rect *)ParmP;
- SortRect(&r);
- if (EmptyRect(&r)) return(NULL);
-
- obj = _GetHandleToRecord(TextObjectRec);
- NullOutHandle(obj);
- (*obj)->dispatch = ObjDispatch;
- FrameRect(&r);
- InsetRect(&r,TEINSET,TEINSET);
- (*obj)->teH = TENew(&r,&r);
- (*obj)->class = TEXT;
- (*obj)->frameIt = TRUE;
- BitSet(&(*obj)->attributes,VisibleBit);
- (*obj)->port = MyFrontWindow();
- (*obj)->bounds = r;
- Dispatch(obj,INVAL,NULL);
- WDispatch((*obj)->port,SETACTIVETEXT,obj);
-
- return((ObjectHandle)obj);
- }
-
-
- /*---------------------------------Dispose-----------*/
-
- void Dispose(ObjectH)
- TextObjectHandle ObjectH;
- {
- TEDispose((*ObjectH)->teH);
- WDispatch((*ObjectH)->port,CLRACTIVETEXT,NULL);
- DisposeHandle(ObjectH);
- }
- /*----------------------------------Draw--------------*/
-
- void Draw(ObjectH)
- TextObjectHandle ObjectH;
- {
- if (BitTst(&(*ObjectH)->attributes,VisibleBit))
- {
- WindowPtr wP;
- int tool;
- wP = (*ObjectH)->port;
-
- EraseRect(&(*ObjectH)->bounds);
- TEUpdate(&(*ObjectH)->bounds,(*ObjectH)->teH);
- if ((*ObjectH)->frameIt)
- {
- PenNormal();
- FrameRect(&(*ObjectH)->bounds);
- }
- if (BitTst(&(*ObjectH)->attributes,SelectedBit))
- { Dispatch(SELF,DRAWHANDLES,NULL);
- }
- }
- }
-
- /*----------------------------------MouseDown--------*/
-
- void MouseDown(ObjectH)
- TextObjectHandle ObjectH;
- {
- extern EventRecord Event;
- Point pt;
- WindowPtr wP;
- long curTool;
- Rect r;
-
- wP = (*ObjectH)->port;
- WDispatch(wP,GETTOOL,&curTool);
- WDispatch(wP,SETACTIVETEXT,ObjectH);
-
- pt = Event.where;
- GlobalToLocal(&pt);
- r = (*ObjectH)->bounds;
- InsetRect(&r,TEINSET,TEINSET);
- if ((curTool == TEXT) AND PtInRect(pt,&r))
- {
- TEClick(pt, _ShiftKeyDown(Event),(*ObjectH)->teH);
- }
- else DrawObjectDispatch(ObjectH,MOUSEDOWN,NULL);
-
-
- }
- /*----------------------------------KeyDown-----*/
-
- void KeyDown(ObjectH)
- TextObjectHandle ObjectH;
- {
- extern EventRecord Event;
- char theChar;
-
- theChar = Event.message & charCodeMask;
- TEKey(theChar,(*ObjectH)->teH);
- }
- /*------------------------------Activate------------*/
-
- void Activate(ObjectH)
- TextObjectHandle ObjectH;
- {
- TEActivate((*ObjectH)->teH);
- }
- /*---------------------------Deactivate--------------*/
-
- void Deactivate(ObjectH)
- TextObjectHandle ObjectH;
- {
- TEDeactivate((*ObjectH)->teH);
- }
- /*---------------------------Resize-----------------*/
-
- void Resize(ObjectH,ParmP)
- TextObjectHandle ObjectH;
- LPtr ParmP;
- {
- register TEHandle teH;
- Rect r;
-
- r = *(Rect *)ParmP;
- (*ObjectH)->bounds = r;
- InsetRect(&r,TEINSET,TEINSET);
- teH = (*ObjectH)->teH;
- (*teH)->destRect = (*teH)->viewRect = r;
- TECalText(teH);
- Dispatch(ObjectH,INVAL,NULL);
- }
- /*----------------------------Move------------------*/
-
- void Move(ObjectH,ParmP)
- register TextObjectHandle ObjectH;
- LPtr ParmP;
-
- {
- int dh,dv;
- TEHandle teH = (*ObjectH)->teH;
-
- if (*ParmP == 0x8000) return;
- dv = HiWord(*ParmP); dh = LoWord(*ParmP);
- Dispatch(ObjectH,INVAL,NULL);
- OffsetRect(&(*ObjectH)->bounds,dh,dv);
- OffsetRect(&(*teH)->destRect,dh,dv);
- OffsetRect(&(*teH)->viewRect,dh,dv);
- Dispatch(ObjectH,INVAL,NULL);
- }
- /*----------------------------------------------------------*/
- /* Here is a sleazy shortcut. Rather than saving all of
- text edits params, I extract the text to a Str255
- (truncating any chars after 255) and save only the string.
- Not too tubular, dude.
-
- SetLength, Pack and UnPack all operate on that assumption
- /*----------------------------------------------------------*/
- #define SKIP1FLD 4
- #define SKIP3FLDS 12
- /*------------------------------SetLength----------------*/
-
- void SetLength(ObjectH)
- TextObjectHandle ObjectH;
- {
- (*ObjectH)->length = GetHandleSize(ObjectH) - SKIP3FLDS + 256;
- }
- /*-------------------------------Pack----------------------*/
- void Pack(ObjectH,h)
- TextObjectHandle ObjectH;
- Handle h;
- {
- Size size;
- Ptr p;
- long nBytes;
- TEHandle teh;
- Str255 str;
- Rect r;
-
- size = GetHandleSize(h);
- SetHandleSize(h,size + (*ObjectH)->length); MEM_CHECK
- nBytes = (*ObjectH)->length - 256;
- HLock(h);
-
- p = *h + size; /* move to end of existing handle */
- BlockMove(&(*ObjectH)->class,p,nBytes);
- p += nBytes;
- teh = (*ObjectH)->teH;
- TEGetString(teh,str);
- StrCopy(str,p);
-
- HUnlock(h);
- }
- /*------------------------------UnPack----------------*/
- void UnPack(ObjectH,pP)
- TextObjectHandle ObjectH;
- Ptr *pP;
- {
- Size obSize;
- IPtr ip = *pP;
- Ptr p;
- long nBytes;
- TEHandle teh;
- Str255 str;
- Rect r;
-
- (*ObjectH)->class = *ip++;
- (*ObjectH)->length = *ip++;
- nBytes = (*ObjectH)->length - 256;
- BlockMove(*pP,&(*ObjectH)->class,nBytes);
- r = (*ObjectH)->bounds;
- InsetRect(&r,TEINSET,TEINSET);
- teh = (*ObjectH)->teH;
- (*teh)->destRect = (*teh)->viewRect = r;
- p = *pP + nBytes;
- StrCopy(p,str);
- TESetString(teh,str);
- *pP += (*ObjectH)->length;
-
- }
-